package com.hxk.juc;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 公平锁和非公平锁
 *      公平锁：
 *          多个线程按照申请锁的顺序来获取锁，类似排队，先到先得
 *      非公平锁：
 *          多个线程抢多锁、会导致优先级反转或饥饿感
 *  `synchronized`和`juc.ReentrantLock`默认都是【非公平锁】。`ReentrantLock`在构造的时候传入`true`则是【公平锁】。
 *  公平锁和非公平锁有什么区别：
 *      公平锁：公平锁在获取锁时先查看此锁维护的等待队列，为空或当前线程是等待队列的队首，则直接占有锁，否则插入到等待队列，FIFO原则。
 *      非公平锁：非公平锁比较粗鲁，一上来直接尝试占有锁，占有失败，则进入公平锁方式，占有成功，直接执行，这使非公平锁的吞吐量高于公平锁。
 */
public class NonfairAndFairLock {

    /**
     * synchronized就是非公平锁
     */
    public synchronized void m1(){
        System.out.println("-------->我是非公平锁");
    }

    /**
     * ReentrantLock的构造方法如下：如果在构造时传人true，则是公平锁，不传则默认是false，是非公平锁
     * public ReentrantLock(boolean fair) {
            sync = fair ? new FairSync() : new NonfairSync();
       }
     */
    Lock lock = new ReentrantLock();
    //Lock lock = new ReentrantLock(true);
    public void m2(){
        lock.lock();
        try {
            System.out.println("-------->new NonfairSync()");
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            lock.unlock();
        }
    }
}
